#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int gval = 100;
int ungval;

//int main(int argc, char* argv[], char* envp[])
//{
//     int val = 10;
//     int unval;
//     printf("code address: %p\n", main);// 正文代码区

    // char* str = "hello world";
    // *str = "1314";
//     printf("read only address: %p\n", str);// 只读常量区

//     printf("init address: 局部: %p, 全局: %p\n", &val, &gval);// 初始化数据区
//     printf("uninit address: 局部: %p, 全局: %p\n", &unval, &unval);// 未初始化数据区

//     int* p = (int*)malloc(4);

//     printf("heap address: %p\n", p);// 堆区
//     printf("stack address: %p\n", &p);// 栈区

//     for (int i = 0; i < argc; i++) {
//         printf("args address: %p\n", argv[i]); // 命令行参数区
//     }
//     for (int i = 0; envp[i]; i++) {
//         printf("env address: %p\n", envp[i]);
//     }
//     return 0;
// }

// int main()
// {
//     printf("code addr: %p\n", main);
//     printf("gval addr: %p\n", &gval);
//     printf("unval addr: %p\n", &unval);

//     int *mem = (int*)malloc(10 * sizeof(int));
//     printf("heap addr: %p\n", mem);

//     int a, b, c;
//     printf("stack addr: %p\n", &a);
//     printf("stack addr: %p\n", &b);
//     printf("stack addr: %p\n", &c);
//}



int main()
{   
    printf("我是一个进程, pid: %d, ppid: %d\n", getpid(), getppid());
    pid_t id = fork();
    if(id == 0)
    {
        while(1)
        {
            printf("子进程, pid: %d, ppid: %d, gval: %d, &gval: %p\n", getpid(), getppid(), gval, &gval);
            gval++;
            sleep(1);
        }
    }
    else
    {
        while(1)
        {
            printf("父进程, pid: %d, ppid: %d, gval: %d, &gval: %p\n", getpid(), getppid(), gval, &gval);
            sleep(1);
        }
    }
    return 0;
}
